package com.warm.base.design.s_composite;

/**
 * @Date: 2019/11/27 13:24
 * @Author: LChuang
 * @Description: 组合模式(结构型)
 *      将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
 */
public class Client {
    /**
     * 允许你将对象组合成树形结构来表现”部分-整体“的层次结构，
     * 使得客户以一致的方式处理单个对象以及对象的组合。
     *
     * 关键的地方是 —— 简单对象和复合对象必须实现相同的接口
     */
    /**
     * Component 组合部件：它是一个抽象角色，为要组合的对象提供统一的接口。
     * Leaf 叶子：在组合中表示子节点对象，叶子节点不能有子节点。
     * Composite 合成部件：定义有枝节点的行为，用来存储部件，实现在Component接口中的有关操作，如增加（Add）和删除（Remove）。
     */
    public static void main(String[] args) {
        /**
         * 1. 透明模式 Component 包含叶子节点不需要的方法
         */
        Component tree = new Composite("tree");
        Component branch = new Composite("--branch");
        Component leafA = new Leaf("----leafA");
        Component leafB = new Leaf("----leafB");
        Component leafC = new Leaf("----leafC");

        tree.add(branch);
        branch.add(leafA);
        branch.add(leafB);
        branch.add(leafC);
        tree.display();

        /**
         * 2. 安全模式 统一行为, Component 中只规定各个层次最基础的一致性行为
         *    删除, 添加方法放到自身中
         */

        /**
         * 透明组合模式 将公共接口封装到抽象根节点（Component）中，
         * 那么系统所有节点就具备一致行为，所以如果当系统绝大多数层次
         * 具备相同的公共行为时，采用 透明组合模式 也许会更好
         * （代价：为剩下少数层次节点引入不需要的方法）；
         * 而如果当系统各个层次差异性行为较多或者树节点层次相对稳定（健壮）时，采用 安全组合模式
         */
    }
}
